/**
 * 映射类型的主要作用：即是 基于键名 映射到 键值类型， 使用 in 关键字
*/

//这个工具类型会接受一个对象类型（假设这么用），
//使用 keyof 获得这个对象类型的键名组成 字面量联合类型，
//然后通过映射类型（即这里的 in 关键字）将这个联合类型的每一个成员映射出来，
//并将其键值类型设置为 string。
type Stringify<T> = {
    [K in keyof T]: string;
};
interface Foo {
    prop1: string;
    prop2: number;
    prop3: boolean;
    prop4: () => void;
}
type StringifiedFoo = Stringify<Foo>;
// 等价于
interface StringifiedFooA {
    prop1: string;
    prop2: string;
    prop3: string;
    prop4: string;
}

//通过 索引类型访问 与 映射类型，克隆一个接口：
type Clone<T> = {
    [K in keyof T]: T[K];
};
type CloneA = Clone<Foo>;

//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }